/**
 * $resource_lseam.js
 * created by LSEAM
 */



String.prototype.trim=function(){
	return this.replace(/(^\s*)|(\s*$)/g, "");
}

if (!Object.prototype.toJSONString) {
    Date.prototype.toJSONString = function (w) {
        var a = [],     // The array holding the partial texts.
            i,          // Loop counter.
            l = this.length,
            v;          // The value to be stringified.


        for (i = 0; i < l; i += 1) {
            v = this[i];
            switch (typeof v) {
            case 'object':

                if (v && typeof v.toJSONString === 'function') {
                    a.push(v.toJSONString(w));
                } else {
                    a.push('null');
                }
                break;

            case 'string':
            case 'number':
            case 'boolean':
                a.push(v.toJSONString());
                break;
            default:
                a.push('null');
            }
        }


        function f(n) {

            return n < 10 ? '0' + n : n;
        }

        return '"' + this.getUTCFullYear()   + '-' +
                   f(this.getUTCMonth() + 1) + '-' +
                   f(this.getUTCDate())      + 'T' +
                   f(this.getUTCHours())     + ':' +
                   f(this.getUTCMinutes())   + ':' +
                   f(this.getUTCSeconds())   + 'Z"';
    };


    Number.prototype.toJSONString = function () {
        return isFinite(this) ? String(this) : 'null';
    };
    
    Array.prototype.toJSONString = function () {
    	var value = "";
    	for(var i = 0; i < this.length; i ++){
    		value += "," + this[i].toJSONString();
    	}
        return "[" + (value.length > 0 ? value.substring(1, value.length) : "") + "]";
    };


    Object.prototype.toJSONString = function (w) {
        var a = [],     // The array holding the partial texts.
            k,          // The current key.
            i,          // The loop counter.
            v;          // The current value.

        if (w) {
            for (i = 0; i < w.length; i += 1) {
                k = w[i];
                if (typeof k === 'string') {
                    v = this[k];
                    switch (typeof v) {
                    case 'object':


                        if (v) {
                            if (typeof v.toJSONString === 'function') {
                                a.push(k.toJSONString() + ':' +
                                       v.toJSONString(w));
                            }
                        } else {
                            a.push(k.toJSONString() + ':null');
                        }
                        break;

                    case 'string':
                    case 'number':
                    case 'boolean':
                        a.push(k.toJSONString() + ':' + v.toJSONString());

                    }
                }
            }
        } else {


            for (k in this) {
                if (typeof k === 'string' &&
                        Object.prototype.hasOwnProperty.apply(this, [k])) {
                    v = this[k];
                    switch (typeof v) {
                    case 'object':


                        if (v) {
                            if (typeof v.toJSONString === 'function') {
                                a.push(k.toJSONString() + ':' +
                                       v.toJSONString());
                            }
                        } else {
                            a.push(k.toJSONString() + ':null');
                        }
                        break;

                    case 'string':
                    case 'number':
                    case 'boolean':
                        a.push(k.toJSONString() + ':' + v.toJSONString());

                    }
                }
            }
        }

        return '{' + a.join(',') + '}';
    };


    (function (s) {

        var m = {
            '\b': '\\b',
            '\t': '\\t',
            '\n': '\\n',
            '\f': '\\f',
            '\r': '\\r',
            '"' : '\\"',
            '\\': '\\\\'
        };


        s.parseJSON = function (filter) {
            var j;

            function walk(k, v) {
                var i, n;
                if (v && typeof v === 'object') {
                    for (i in v) {
                        if (Object.prototype.hasOwnProperty.apply(v, [i])) {
                            n = walk(i, v[i]);
                            if (n !== undefined) {
                                v[i] = n;
                            }
                        }
                    }
                }
                return filter(k, v);
            }

            if (/^[\],:{}\s]*$/.test(this.replace(/\\./g, '@').
                    replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(:?[eE][+\-]?\d+)?/g, ']').
                    replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {


                j = eval('(' + this + ')');

                return typeof filter === 'function' ? walk('', j) : j;
            }

            throw new SyntaxError('parseJSON');
        };


        s.toJSONString = function () {

            if (/["\\\x00-\x1f]/.test(this)) {
                return '"' + this.replace(/[\x00-\x1f\\"]/g, function (a) {
                    var c = m[a];
                    if (c) {
                        return c;
                    }
                    c = a.charCodeAt();
                    return '\\u00' + Math.floor(c / 16).toString(16) +
                                               (c % 16).toString(16);
                }) + '"';
            }
            return '"' + this + '"';
        };
    })(String.prototype);
}

var Lseam = new Object();

Lseam.type = new Object();

Lseam.types = new Array();

Lseam.components = new Array();

Lseam.component = new Object();

Lseam.setType = function (type) {
	for (var i = 0; i < Lseam.types.length; i++)
		if (Lseam.types[i].__name == type.__name) {
			Lseam.types[i] = type;
			return;
		}
	Lseam.types.push(type);
};

Lseam.getType = function (name) {
	for (var i = 0; i < Lseam.types.length; i++)
		if (Lseam.types[i].__name == name)
			return new Lseam.types[i];
};

Lseam.setComponent = function (component) {
	for (var i = 0; i < Lseam.components.length; i++) {
		if (Lseam.components[i].__name == component.__name) {
			Lseam.components[i] = component;
			return;
		}
	}
	Lseam.components.push(component);
};

Lseam.getComponent = function (name) {
	for (var i = 0; i < Lseam.components.length; i++)
		if (Lseam.components[i].__name == name)
			return new Lseam.components[i];
};

Lseam.getValueType = function (value) {
	if(value == null)
		return "{\"value\": null, \"type\": \"java.lang.Object\"}";;
	switch (typeof (value)) {
		case "boolean":
			return "{\"value\": " + value + ", \"type\": \"java.lang.Boolean\"}";
		case "number":
			return "{\"value\": " + value + ", \"type\": \"java.lang.Number\"}";
		case "object":
			if(value instanceof Date){
				return "{\"value\": " + value.toJSONString() + ", \"type\": \"java.util.Date\"}";
			}else if(value instanceof Array){
				return "{\"value\": " + value.toJSONString() + ", \"type\": \"java.lang.Object[]\"}";
			}else{
				return "{\"value\": " + value.toJSONString() + ", \"type\": \"java.lang.Object\"}";
			}
		default:
			return "{\"value\": " + value.toJSONString() + ", \"type\": \"java.lang.String\"}";
	}
};

Lseam.execute = function (component, methodName, params, callback) {
	var _params = "";
	for(var i = 0; i < params.length; i ++){
		var value = params[i];
		_params += Lseam.getValueType(value) + "@LSEAM-FGF@";
	}
	if(_params.length > 0)
		_params = _params.substring(0, _params.length - 11);
	return Lseam.sendAjaxRequest("/execute/" + component.name + "." + methodName, _params, callback);
};

Lseam.sendAjaxRequest = function (url, param, callback) {
	var xmlHttpRequest;
	if (window.XMLHttpRequest) {
		xmlHttpRequest = new XMLHttpRequest();
		if (xmlHttpRequest.overrideMimeType)
			xmlHttpRequest.overrideMimeType("text/xml");
	} else
		xmlHttpRequest = new ActiveXObject("Microsoft.XMLHTTP");
	xmlHttpRequest.onreadystatechange = function () {
		if (xmlHttpRequest.readyState == 4)
			if (xmlHttpRequest.status == 200) {
				var returnValue = xmlHttpRequest.responseText;
				if(returnValue != null && returnValue.length > 0) {
					if(returnValue.trim().substring(0, 4) == "info") {
						alert(returnValue.split(":")[1].trim());
						return;
					}
				} else
					returnValue = "";
				if (callback)
					if(returnValue != null && returnValue.length > 0)
						callback(returnValue.parseJSON().value);
					else
						callback();
			} else
				window.alert("LSEAM's request is error.");
	};
	xmlHttpRequest.open("POST", Lseam.resourcePath + "/" + url, true);
	xmlHttpRequest.send(param);
};
Lseam.resourcePath = "/system/seam/resources";
/**
 * $resource_lseam.js
 * created at Mon Nov 21 13:49:55 CST 2011
 */

